import pygame
from background import Background
from character import Character
from music import Music
from paddle import Paddle
from ball import Ball
from coin import Coin
import random
from func import *

# 初始化 pygame
pygame.init()

# 定义宽度高度
screen_width = 800
screen_height = 600

# 创建游戏窗口
screen = pygame.display.set_mode((screen_width, screen_height))
# 设置游戏标题
pygame.display.set_caption("打砖块")
# 设置背景颜色为黑色
screen.fill((255, 255, 255))

# 创建背景对象
background = Background(screen)
# 加载背景图片
background.load_image("./image/1.png")

# 创建球拍对象
paddle = Paddle(screen)
# 加载图片
paddle.load_image("./image/4.png")
# 设置大小
paddle.set_size(0.2)
# 设置位置
paddle.set_position((screen_width/2 - paddle.width*paddle.size/2), screen_height-50)
# 设置面向方向=0
paddle.set_direction(0)

# 创建球列表
ball_list = []

# 定义循环次数（默认为1）
loop_times = 1

# 创建球
for i in range(loop_times):
    # 创建球对象
    ball = create_ball(screen,paddle)
    # 将球添加到列表中
    ball_list.append(ball)



# 创建砖块列表
brick_list = []
# 定义x,y坐标
x = 0
y = 0

for i in range(30):  # 行数
    # 为每一行创建一个子列表
    brick_list.append([])  # 添加这一行
    x = 0  # 每一行开始时重置x坐标
    
    for j in range(40):  # 每行的砖块数量
        # 创建砖块对象
        brick = Character(screen)
        # 加载图片
        brick.load_image("./image/7.png")
        # 设置大小
        brick.set_size(0.1)
        # 设置位置
        brick.set_position(x, y)
        # 设置面向方向=0
        brick.set_direction(0)
        # 将砖块向右移动
        x += brick.width * brick.size
        # 添加到对应行的列表中
        brick_list[i].append(brick)
    
    # 换行
    y += brick.height * brick.size

# 创建金币列表
coin_list = []
# 创建coin的group组别
coin_group = pygame.sprite.Group()
# 创建金币对象
coin = create_coin(screen)
# 添加到列表
coin_list.append(coin)
# 添加到group组别中
coin_group.add(coin)

# 设置时钟
clock = pygame.time.Clock()

# 循环
while True:
    # 获取事件
    for event in pygame.event.get():
        # 退出事件
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    # 获取键盘输入
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        paddle.move_by_direction(-5)
    elif keys[pygame.K_RIGHT]:
        paddle.move_by_direction(5)

    # 绘制背景
    background.draw()
    # 绘制球拍
    paddle.draw()
    # 绘制砖块
    for row in brick_list:  # 遍历每一行
        for brick in row:   # 遍历该行中的每个砖块
            brick.draw()
    # 绘制球
    for ball in ball_list:  # 遍历球列表
        ball.draw()

    # 移动球
    for ball in ball_list:  # 遍历球列表
        # 移动球
        ball.move_by_direction(5)
        # 检测球是否与屏幕边缘发生碰撞
        ball.bounce_edge()
        # 检测球是否与球拍发生碰撞
        ball.bounce_paddle(paddle)
        # 检测球是否与砖块发生碰撞
        for row in brick_list:  # 遍历每一行
            for brick in row:   # 遍历该行中的每个砖块
                if not (hasattr(brick, '_destroyed') and brick._destroyed):  # 只检测未被销毁的砖块
                    if ball.rect.colliderect(brick.rect):  # 先做基本碰撞检测
                        ball.bounce_brick(brick)  # 处理反弹和销毁
                        break  # 球一次只能撞一个砖块，撞到后跳出循环

    # 绘制金币
    for coin in coin_list:  # 遍历金币列表
        coin.draw()
    
    # 移动金币
    for coin in coin_list[:]:  # 使用切片创建副本以避免在迭代时修改列表
        # 向下移动金币
        coin.move(0, 2)
        # 检查金币是否已被销毁
        if hasattr(coin, '_destroyed') and coin._destroyed:
            if coin in coin_list:  # 确保元素还在列表中
                coin_list.remove(coin)

    # 检测球拍的碰撞
    hit_coin_list = paddle.collision(coin_group)
    # 碰撞处理
    for hit_coin in hit_coin_list:
        # 从列表中移除
        coin_list.remove(hit_coin)
        # 销毁对象
        hit_coin.destroy()
        # 将hit_coin设置为None
        hit_coin = None

        # 创建随机数量的ball
        ball_count = random.randint(1, 5)
        # 循环
        for i in range(ball_count):
            # 创建ball
            ball = create_ball(screen,paddle)
            # 添加到列表
            ball_list.append(ball)

    # 定期清理已销毁的砖块
    for row in brick_list:
        for brick in row[:]:  # 使用切片复制列表
            if hasattr(brick, '_destroyed') and brick._destroyed:
                row.remove(brick)

    # 刷新频率
    clock.tick(60)

    # 更新屏幕
    pygame.display.update()